<?php

class Users_RecoverAction extends SrsUsersBaseAction
{
	public function isSecure()
	{
		return false;
	}
	
	public function executeRead(AgaviRequestDataHolder $rd)
	{
		if ($rd->hasParameter('key'))
		{
			return $this->executeWrite($rd);
		}

    if ($rd->hasParameter('user'))
    {
      return 'Confirm';
    }

		return 'Input';
	}

	public function executeWrite(AgaviRequestDataHolder $rd)
	{
		$user = Doctrine_Query::create()
		        ->from('User')
			      ->where('active=1 AND email=?', $rd->getParameter('user'))
					  ->fetchOne();

		if (empty($user))
		{
			$this->addError('wrong_email', 'user', 'Nieprawidłowy adres e-mail.');

			return 'Error';
		}

		if ($rd->hasParameter('key'))
		{
      return $this->sendNewPassword($user, $rd->getParameter('key'));
		}

		return $this->sendConfirmKey($user);
	}

	private function sendConfirmKey(User $user)
	{
    $user->confirmKey = hash('sha256', uniqid(microtime()));
    $user->save();

    $this->sendEmailWithConfirmKey($user);

    return 'Confirm';
	}

	private function sendNewPassword(User $user, $key)
	{
		if (strtolower($user->confirmKey) != strtolower($key))
		{
			$this->addError('wrong_key', 'key', 'Nieprawidłowy klucz potwierdzenia.');

			return 'ConfirmError';
		}

		$newPassword = substr(md5(uniqid(microtime())), 0, 8);

		$user->password   = hash('sha256', $newPassword);
    $user->confirmKey = '';
		$user->save();

		$this->sendEmailWithNewPassword($user, $newPassword);

		return 'Success';
	}

	private function sendEmailWithNewPassword(User $user, $newPassword)
	{
		$url = $this->createUrl($user->email, $user->confirmKey);

		$message = <<<MSG
Witaj, {$user->name}!

Twoje nowe hasło w Systemie Rezerwacji Sal Uniwersytetu Warmińsko-Mazurskiego:
{$newPassword}

Z poważaniem, SRS-UWM.
MSG;

		$mailer = Mailer::fromConfig('app.mailer');
		$mailer->createMessage('Nowe hasło do SRS-UWM')
		       ->addTo($user->email)
		       ->setBody($message);
		$mailer->send();
	}

	private function sendEmailWithConfirmKey(User $user)
	{
		$url = $this->createUrl($user->email, $user->confirmKey);

		$message = <<<MSG
Witaj, {$user->name}!

Ty lub ktoś podający się za Ciebie poprosił o odzyskanie hasła w Systemie Rezerwacji Sal Uniwersytetu Warmińsko-Mazurskiego.
Jeżeli to nie byłeś Ty, zignoruj ten e-mail. W przeciwnym wypadku kliknij na poniższy odnośnik, aby wygenerować nowe hasło:
{$url}
lub wpisz poniższy kod w odpowiednie pole formularza, który ukazał się po wysłaniu formularza odzyskiwania hasła:
{$user->confirmKey}

W razie jakichkolwiek wątpliwości prosimy o kontakt.

Z poważaniem, SRS-UWM.
MSG;

		$mailer = Mailer::fromConfig('app.mailer');
		$mailer->createMessage('Odzyskiwanie hasła do SRS-UWM')
		       ->addTo($user->email)
		       ->setBody($message);
		$mailer->send();
	}

	private function createUrl($email, $key)
	{
		$rq = $this->context->getRequest();

		return $rq->getUrlScheme()
			. '://' . $rq->getUrlAuthority()
			. str_replace('&amp;', '&', $this->context->getRouting()->gen('recover', array('user' => $email, 'key' => $key)));
	}
}